package org.pillar.fitness.clue.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.pillar.fitness.clue.domain.Assignment;
import org.pillar.fitness.clue.domain.Clue;
import org.pillar.fitness.clue.domain.vo.ClueSummary;
import org.pillar.fitness.clue.mapper.ClueMapper;
import org.pillar.fitness.clue.service.IAssignmentService;
import org.pillar.fitness.clue.service.IClueService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.pillar.fitness.common.constant.TienChinConstants;
import org.pillar.fitness.common.core.domain.AjaxResult;
import org.pillar.fitness.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author javaboy
 * @since 2023-01-16
 */
@Service
public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements IClueService {

    //线索、商机专员表
    @Autowired
    IAssignmentService assignmentService;

    @Autowired
    ClueMapper clueMapper;

    @Override
    //由于这里操作两张表 应该加事物 同时成功同时失败
    @Transactional
    public AjaxResult addClue(Clue clue) {
        // 首先要查询用户手机号码 是否存在 用来判断之前是否已经是线索了
        // 然后客户又联系你了 那这样算之前入录的（还在线索有效期保护期内） 这样就不算你的客户了
        // 算之前专员的业绩 人家已经早就在和客户聊
        QueryWrapper<Clue> qw = new QueryWrapper<>();
        qw.lambda().eq(Clue::getPhone, clue.getPhone());
        Clue one = getOne(qw);
        if (one != null) {
            return AjaxResult.error("手机号码重复，线索录入失败");
        }
        //下次跟进时间
        clue.setNextTime(LocalDateTime.now().plusHours(TienChinConstants.NEXT_FOLLOW_TIME));
        clue.setCreateBy(SecurityUtils.getUsername());
        clue.setCreateTime(LocalDateTime.now());
        //状态可以设置默认值为1 松哥这样设置
        //我这里代码设置算了 创建表时没弄
        clue.setStatus(1); //谁添加就分配给自己 就是已分配状态 1
        //添加线索成功后需要在线索\商机用户表添加 线索分配人信息
        try {
            //添加线索
            save(clue);  //myplus默认有主键回填的功能 所以直接返回新增的线索id给实体
            //添加线索默认的分配人
            Assignment assignment = new Assignment();
            //线索或者商机的id
            assignment.setAssginId(clue.getClueId());
            //是否是最新的分配人
            assignment.setLatest(true);
            //类型是商机还是线索 因为都是在一张表记录 所以需要区分
            assignment.setType(TienChinConstants.CLUE_TYPE);
            //分配用户
            assignment.setUserId(SecurityUtils.getUserId());
            assignment.setDeptId(SecurityUtils.getDeptId());
            assignment.setUserName(SecurityUtils.getUsername());
            assignment.setCreateBy(SecurityUtils.getUsername());
            assignment.setCreateTime(LocalDateTime.now());
            assignment.setDelFlag(false);
            //因为一条线索/商机可能要经过很多专员 需要设置当前最新在处理的专员 （这个在新增时不需要设置）
            assignmentService.save(assignment);
            return AjaxResult.success("线索录入成功");
        } catch (Exception e) {
            return AjaxResult.error("线索录入失败");
        }
    }

    @Override
    public List<ClueSummary> selectClueList() {
        //因为这里需要多表联查 展示数据 所以需要自己写sql 稳一点
        //使用左连接 如果线索出现没有分配的情况为空就好 表示线索待认领
        return clueMapper.selectClueList();
    }
}
